package userfunctions;

import java.util.Date;
import java.util.Vector;
import userfunctions.packets.banker.*;
import userfunctions.packets.client.*;

/**
 * Klasa bankiera.
 * @brief Klasa pozwala na podstawowe operacje na koncie bankiera.
 * @author Kamil Woźnicki i Michał Krajewski
 */
public class Banker extends Person {
    /**
     * Metoda dodajaca klienta.
     * @param imie Imię nowego klienta.
     * @param nazwisko Nazwisko nowego klienta.
     * @param adres1 Adres nowego klienta.
     * @param adres2 Dalsza częsc adresu nowego klienta.
     * @param data_urodzenia Data urodzenia nowego klienta.
     * @param pesel Pesel nowego klienta.
     * @param numer_dowodu Numer dowodu nowego klienta.
     * @param imie_ojca Imie ojca nowego klienta.
     * @param imie_matki Imie matki nowego klienta.
     * @param nazwisko_panienskie_matki Nazwisko panienskie matki klienta.
     * @return Wartosc logiczna okreslajaca wykonanie operacji.
     */
    public boolean dodajKlient(String imie, String nazwisko, String adres1,
            String adres2, Date data_urodzenia, String pesel,
            String numer_dowodu, String imie_ojca, String imie_matki,
            String nazwisko_panienskie_matki) {
        PacketClient packet = new PacketClient(imie, nazwisko, adres1,
                adres2, data_urodzenia, pesel, numer_dowodu, imie_ojca,
                imie_matki, nazwisko_panienskie_matki);
        
        sendPacket(packet);
        return handleResponse();
    }
    
    /**
     * Metoda usuwa klienta z systemu.
     * @param numer_klienta Identyfikator klienta w systemie.
     * @return Wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean usunKlienta(String numer_klienta) {
        PacketRemoveClient packet = new PacketRemoveClient(numer_klienta);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Metoda pobierajaca dane klienta.
     * @param userId identyfikator klienta.
     * @return Wartosc logiczna okreslajaca poprawnsoc operacji.
     */
    public boolean pobierzDaneKlienta(String userId) {
        PacketInformationRequest packet = new PacketInformationRequest(userId);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Metoda edytujaca dane klienta.
     * @param numerKlienta
     * @param imie
     * @param nazwisko
     * @param adres1
     * @param adres2
     * @param data_urodzenia
     * @param pesel
     * @param numer_dowodu
     * @param imie_ojca
     * @param imie_matki
     * @param nazwisko_panienskie_matki
     * @return Wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean zmienDaneKlienta(String numerKlienta, String imie, String nazwisko,
            String adres1, String adres2, Date data_urodzenia, String pesel,
            String numer_dowodu, String imie_ojca, String imie_matki,
            String nazwisko_panienskie_matki) {
        
        PacketClient packet = new PacketClient(imie, nazwisko, adres1,
                adres2, data_urodzenia, pesel, numer_dowodu, imie_ojca,
                imie_matki, nazwisko_panienskie_matki);
        packet.mode = PacketClient.Tryb.Edytuj;
        
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Metoda tworzaca konto uzytkownika.
     * @param numer_uzytkownika idetyfikator uzytkownika.
     * @param typ_konta Rodzaj nowo utworzonego konta.
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean utworzKonto(String numer_uzytkownika, int typ_konta) {
        PacketAccount packet = new PacketAccount(numer_uzytkownika, typ_konta);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Metoda usuwa konto klienta z systemu.
     * @param numerKonta
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean usunKonto(String numerKonta) {
        PacketAccount packet = new PacketAccount(numerKonta);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Zmienia podstawowe dane konta danego uzytkownika.
     * @param numerKonta
     * @param oprocentowanie
     * @param okres_kapitalizacji
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean zmienDaneKonta(String numerKonta, float oprocentowanie,
            int okres_kapitalizacji) {
        PacketAccount packet = new PacketAccount(numerKonta, oprocentowanie, okres_kapitalizacji);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Dodaje nowy typ konta do systemu.
     * @param oprocentowanie
     * @param kapitalizacja
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean dodajTypKonta(float oprocentowanie, int kapitalizacja) {
        sendPacket(new PacketAddType(oprocentowanie, kapitalizacja));
        
        return handleResponse();
    }
    
    /**
     * Pobiera typy kont dostepne w systemie.
     * @return Vector zawierajacy typy kont.
     */
    public Vector<String> wyswietlTypyKont() {
        sendPacket(new PacketListTypes());
        return handleVector();
    }

    /**
     * Dokonanie wplaty.
     * @param numer_konta
     * @param kwota
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean wplata(String numer_konta, float kwota) {
        PacketTransfer packet = new PacketTransfer(null, numer_konta, kwota, PacketTransfer.TransferType.Internal);
        sendPacket(packet);
        return handleResponse();
    }
    
    /**
     * Dokonanie wyplaty.
     * @param numer_konta
     * @param kwota
     * @return Zwraca wartosc logiczna okreslajaca poprawnosc operacji.
     */
    public boolean wyplata(String numer_konta, float kwota) {
        PacketTransfer packet = new PacketTransfer(numer_konta, null, kwota, PacketTransfer.TransferType.Internal);
        sendPacket(packet);
        
        return handleResponse();
    }
    
    /**
     * Pobiera liste uzytkownikow systemu.
     * @return Vector zawierajacy liste uzytkownikow korzystajacych z systemu.
     */
    public Vector<String> listaUzytkownikow() {
        sendPacket(new PacketListUsers());
        
        return handleVector();
    }
}
